home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / PCASM2.ZIP / BAS1.DOC next >
Text File  |  1990-08-01  |  16KB  |  352 lines

  1.  
  2.  
  3.  
  4.                                                                            mmi
  5.  
  6.  
  7.                                     USING BASIC - 1
  8.  
  9.              So you like using BASIC. I can't blame you. BASIC has several
  10.              very nice features. 
  11.  
  12.                  (1) Its graphics interface is easy to use and is very
  13.                  powerful. If you want to draw lines, circles, patterns or
  14.                  other graphics images, you can do it. Your only limitations
  15.                  are the aspect ratio of the screen and the possible screen
  16.                  colors. These limitations have to do with hardware, not with
  17.                  BASIC. 
  18.  
  19.                  (2) Its string handling capabilities are unparalleled. If
  20.                  you want to have an array of strings like the following:
  21.  
  22.                       DIM  STRING.ARRAY$ (50, 25)  ' 1250 elements
  23.  
  24.                  and some of the elements are only a couple of characters
  25.                  long but some of the strings are several hundred characters
  26.                  long, BASIC is the ONLY language that can handle it
  27.                  correctly. In fact, if you wanted one of the strings to be
  28.                  1000 characters (it's allowed in the most recent BASIC),
  29.                  then you would need 1.25 megabytes for this array in C or in
  30.                  PASCAL. This would probably be too big for the computer.
  31.                  BASIC, on the other hand, implements this without wasting
  32.                  any space in memory.
  33.  
  34.  
  35.              BASIC has a few things that require a little more work than with
  36.              other languages. It has strings, integers, and floating point
  37.              numbers but it is missing characters and unsigned numbers - these
  38.              can be implemented by using integers (if you are careful). This
  39.              is not all that limiting.
  40.  
  41.  
  42.              If BASIC is so nice, why do I think that you should have some
  43.              experience with a structured language before doing assembler? It
  44.              all has to do with data INTEGRITY. The question is, are you sure
  45.              that you haven't inadvertantly screwed up your data? There are
  46.              two ways that this might happen. You need to know how BASIC works
  47.              to understand the problem.
  48.  
  49.              A variable name in BASIC consists of a name followed by a type
  50.              identifier. The identifiers are '%', '!', '$', '#' (double
  51.              precision) and possibly '&' (long integer). The name:
  52.  
  53.                  CURRENT.TEMPERATURE
  54.  
  55.              is NOT a variable inside of BASIC while:
  56.  
  57.                  CURRENT.TEMPERATURE%
  58.                  CURRENT.TEMPERATURE!
  59.                  CURRENT.TEMPERATURE$
  60.  
  61.              ______________________
  62.  
  63.              The PC Assembler Tutor - Copyright (C) 1990 Chuck Nelson
  64.  
  65.  
  66.  
  67.  
  68.              The PC Assembler Tutor                                       mmii
  69.              ______________________
  70.  
  71.              are all valid variables. In fact, all three can be in the same
  72.              program, as we shall see shortly. I just said that that first
  73.              example is not a valid variable inside of BASIC, but that is
  74.              exactly what you have been writing since the first time that you
  75.              wrote a BASIC program. What's going on here? Well, when the BASIC
  76.              interpreter or compiler reads the text file, it reads the name
  77.              and the identifier. If the type identifier is missing, it tacks
  78.              the default identifier on to the end of the name.
  79.  
  80.              What's the default type identifier? The answer is '!'. BASIC
  81.              maintains a default list. The legal first characters in a name
  82.              are A-Z. For each legal first letter, there is an entry in the
  83.              list which says what the default type for that letter is. When
  84.              you start the program, the type list looks like this:
  85.  
  86.                  !!!!!!!!!!!!!!!!!!!!!!!!!!
  87.  
  88.              When the interpreter sees a name without an identifier, it takes
  89.              the first character of the name and goes to the default-type
  90.              list, gets the appropraiate type identifier for that first
  91.              character, and adds the identifier on to the end of the name.
  92.              Externally (in your text file) there may be names without type
  93.              identifiers, but internally (inside the interpreter/compiler) ALL
  94.              variables have the type identifier after the name.
  95.  
  96.              Though the list starts out with all '!'s, you can change this
  97.              list with a DEF statement. Here are some DEF statements and how
  98.              they change the list. I am assuming that we are always starting
  99.              at the beginning of the program (with all '!'s).
  100.  
  101.                  (1) 
  102.                  DEFINT A-Z     ' This is probably your favorite
  103.                  %%%%%%%%%%%%%%%%%%%%%%%%%%
  104.  
  105.                  (2) 
  106.                  DEFINT A-E
  107.                  %%%%%!!!!!!!!!!!!!!!!!!!!!
  108.  
  109.                  (3)
  110.                  DEFINT A-E
  111.                  DEFSTR F-K
  112.                  DEFDBL L-R
  113.                  %%%%%$$$$$$#######!!!!!!!!
  114.  
  115.              This last one is a recipe for disaster, but it's legal. 
  116.  
  117.              Have you understood everything so far? Then let's go on. This
  118.              ability to NOT use the type identifier leads to laziness. The
  119.              usual thing is to always identify strings with a '$' but to be
  120.              rather lax about the distinction between integers and floating
  121.              point numbers. 
  122.  
  123.              Now we get to the problem. Look at the following code:
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.              BASIC I - Using Basic                                       mmiii
  133.              _____________________
  134.  
  135.  
  136.              10       DEFINT A-Z
  137.              20       FOR I = 1 to 5
  138.              30            LARGE.NUMBER! = 300.0 * I
  139.              40            SMALL.NUMBER! = LARGE.NUMBER / 7
  140.              50            PRINT  LARGE.NUMBER!, SMALL.NUMBER!
  141.              60            NEXT I
  142.  
  143.              If you can't see the error, I forgot to put the '!' after
  144.              LARGE.NUMBER in line 40. The problem here is that BASIC is not
  145.              going to complain. When it sees LARGE.NUMBER without a type
  146.              identifier, it will go to the default list (because of the DEFINT
  147.              statement, all defaults are integer) and put a % after it. BASIC
  148.              has created a SECOND variable with the same initial name, but a
  149.              different type. This is not because you wanted it to, but rather
  150.              because you forgot a '!'. Lets do a BASIC program. Here's some
  151.              code:
  152.  
  153.                  *******************  NINJA.BAS *******************
  154.  
  155.                  10                       ' place for defint statement
  156.                  20      '
  157.                  30      ' enter all the data
  158.                  40      NINJA% = 20
  159.                  50      NINJA! = 4.7134E+13
  160.                  60      NINJA$ = "Hey dude!"
  161.                  70      '
  162.                  80      NINJA$ (0) = "howdy! "
  163.                  90      FOR I% = 1 TO 5
  164.                  100         NINJA$ (I%) = NINJA$ ( I% - 1 ) + "doody! "
  165.                  110         NINJA! (I%) = I% * 25.31
  166.                  120         NINJA% (I%) = I% * 3
  167.                  130     NEXT I%
  168.                  140     '
  169.                  150     ' print all the data
  170.                  160     PRINT   NINJA%, NINJA!, NINJA$
  171.                  170     FOR I% = 1 TO 5
  172.                  180         PRINT NINJA% (I%), NINJA! (I%), NINJA$ (I%)
  173.                  190     NEXT I%
  174.                  200     PRINT  NINJA , NINJA (3)
  175.                  210     '
  176.                  220     END
  177.  
  178.                  *********************************************************
  179.  
  180.              I actually want you to run this through your BASIC. I have
  181.              defined SIX different NINJAs. They are:
  182.  
  183.                  1)   NINJA%
  184.                  2)   NINJA% ( )
  185.                  3)   NINJA! 
  186.                  4)   NINJA! ( )
  187.                  5)   NINJA$
  188.                  6)   NINJA$ ( )
  189.  
  190.              where the parentheses indicate an array. If I had gotten carried
  191.              away, I could have included 4 more NINJAs for double precision,
  192.  
  193.  
  194.  
  195.  
  196.              The PC Assembler Tutor                                       mmiv
  197.              ______________________
  198.  
  199.              double precision array, long integer and long integer array.
  200.  
  201.              Running this through my computer I get:
  202.  
  203.              20          4.7134E+13  Hey dude!
  204.              3           25.31       howdy! doody! 
  205.              6           50.62       howdy! doody! doody!
  206.              9           75.93       howdy! doody! doody! doody!
  207.              12          101.24      howdy! doody! doody! doody! doody!
  208.              15          126.55      howdy! doody! doody! doody! doody! doody!
  209.              4.7134E+13  75.93
  210.  
  211.              Notice that I have 3 different array types and 3 different
  212.              variable types. As you can see from the bottom line (which prints
  213.              the defaults), the default here is '!'. If we now put DEFINT A-Z
  214.              on line 10:
  215.  
  216.                  10   DEFINT A-Z
  217.  
  218.              everything will stay the same except the bottom line which now
  219.              is:
  220.  
  221.                  20        9
  222.  
  223.              which are the integers. Finally, if we have DEFSTR A-Z
  224.  
  225.                  10   DEFSTR A-Z
  226.  
  227.              we get:
  228.  
  229.                  Hey dude!    howdy! doody! doody! doody!
  230.  
  231.              as the bottom line of output. If you didn't know all of this
  232.              before, make sure you have assimilated this before going on.
  233.  
  234.  
  235.              PASCAL and C
  236.  
  237.              Both PASCAL and C require you to account for every variable. You
  238.              need to specifically state what kind of variable it is and you
  239.              need to enter it in a list of variables used in that block of
  240.              code:
  241.  
  242.                  int    ch, variable1, variable2, variable3[60] ;
  243.                  char   long_array[4027] ;
  244.  
  245.              A name can be used in only one way in any block of code. If you
  246.              try to use it differently, the compiler will generate an error.
  247.              Though people moan and groan about having to specifically list
  248.              all the variables used in a block of code, over time they get
  249.              used to it. It offers two advantages. 
  250.  
  251.                  (1) No variable can be inadvertently used in an incorrect
  252.                  way (used as a string when you wanted an integer, used as an
  253.                  integer when you wanted a floating point number, etc.).
  254.  
  255.                  (2) There can be no variables which are misspelled, are left
  256.  
  257.  
  258.  
  259.  
  260.              BASIC I - Using Basic                                         mmv
  261.              _____________________
  262.  
  263.                  over from a previous version of the code or appear by
  264.                  mistake, without both the compiler and you knowing about
  265.                  them.
  266.  
  267.              Slightly modifying names is one of my major problems. I might use
  268.              'long_array' and 'longarray' in different places in the C code,
  269.              though I want the same thing. C will catch this, BASIC won't.
  270.              Every time BASIC encounters a slightly different name it simply
  271.              creates a new variable (and normally sets it to 0). In programs
  272.              larger than a few pages, this situation is almost impossible to
  273.              detect or control.
  274.  
  275.  
  276.  
  277.              THE RANGE OF A VARIABLE
  278.  
  279.              When talking about PASCAL and C I kept using the word BLOCK. Both
  280.              languages have a modular (or block) design. The philosophy behind
  281.              this is that when you write a program you want to divide a task
  282.              into a number of distinct subtasks, and you don't want these
  283.              subtasks to interfere with each other. You put each of these in a
  284.              subprogram. In BASIC you can put sections of a program in
  285.              subprograms too. This is good programming practice. There is a
  286.              difference, however. In C and PASCAL, a variable is valid ONLY in
  287.              the block in which it is declared (unless you take specific steps
  288.              to make it universally valid). If you try to use this variable in
  289.              a different block of code the compiler will generate an error -
  290.              it literally has no information about where this variable is. In
  291.              BASIC, all names are valid everywhere in a file. If on page 1 you
  292.              have:
  293.  
  294.                  210 CURRENT.PRICE! = 427.11
  295.  
  296.              you may want to use this as a constant number throughout the
  297.              program. But if in a subprogram on page 23 you have:
  298.  
  299.                  12060     CURRENT.PRICE! = 0
  300.  
  301.              you have changed the value. You're saying to yourself "But why
  302.              would I change a variable like "CURRENT.PRICE!"? You probably
  303.              wouldn't. But you will have dozens and dozens of variables around
  304.              with names like I, J, K, COUNT, START, STARTING.NUMBER,
  305.              STARTING.VALUE, TOTAL, RESULT and LAST.VALUE (whatever their
  306.              type). It is exactly these that will be corrupted in BASIC but
  307.              will be reliable in C or PASCAL. 
  308.  
  309.                  **********************************************
  310.                  1920      MINIMUM! = RATE! * 5.0
  311.                  1930      MAXIMUM! = RATE! * 7.32
  312.                  1940      COUNT% = (MAXIMUM! - MINIMUM!) / 3.0
  313.                  1950      CALL CHECK.ANSWER 
  314.                  1960      PRINT COUNT%
  315.                  **********************************************
  316.  
  317.              In this section of code, did 'CALL CHECK.ANSWER' change any of
  318.              the four variables MINIMUM!, MAXIMUM!, RATE! or COUNT%? In BASIC,
  319.              we hope so, but we can't be sure. In PASCAL or C we KNOW that it
  320.  
  321.  
  322.  
  323.  
  324.              The PC Assembler Tutor                                       mmvi
  325.              ______________________
  326.  
  327.              didn't change any code. This is the difference between a
  328.              structural engineer HOPING that a bridge won't fall down and
  329.              KNOWING that a bridge won't fall down.
  330.  
  331.              In fact, the PASCAL and C programmers will probably be annoyed
  332.              when they start using assembler because in assembler, ALL names
  333.              are valid everywhere. More importantly, however, these
  334.              programmers will make great efforts to insure that all constants
  335.              stay constants and that each variable is used for one job only.
  336.  
  337.  
  338.              Finally, some BASIC programmers still do most of their
  339.              programming using GOTO statements instead of CALLs. This is the
  340.              antethesis of modular programming and is called spaghetti
  341.              programming. The code winds up as an intertwined mess. If you are
  342.              one of these people, once you start writing assembler code it
  343.              will be impossible to figure out what the code is doing once it
  344.              is longer than a page or two. 
  345.  
  346.              All that being said, if you feel that your programming style is
  347.              clear and orderly, have a fun time learning assembler. When you
  348.              are done with all the chapters, read the second BASIC appendix on
  349.              the problems associated with linking a non-BASIC subprogram to a
  350.              BASIC program.
  351.  
  352.